﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "ICurve3d.h"
#include "Coordinate3d.h"

namespace gcmp
{
    /// \brief 三维螺旋线
    ///
    class ISpiralLine3d : public ICurve3d
    {
        DEFINE_CAST_DERIVED(gcmp::ISpiralLine3d, gcmp::ICurve3d);
    public:

        /// \brief 根据坐标系、半径、参数范围、顺逆方向、高度系数、半径系数构建螺旋线对象
        /// \param coord              螺旋线坐标系，起点位于XY平面且在X轴上, Z轴是螺旋线的旋转轴,Z轴方向是高度增加的方向
        /// \param radius             螺旋线的半径,由于容差的存在，需要大于 1E-4，否则会被认为半径为0
        /// \param range              螺旋线的参数范围
        /// \param heightCoef         螺旋线的高度系数 含义为螺旋线的高度/range.Length() 
        /// \param radiusCoef         螺旋线的半径系数 含义为螺旋线的半径差/range.Length(),0代表常半径
        /// \param antiClockwise      弧顺逆方向，true：逆时针， false：顺时针    
        /// \return 三维螺旋线
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<ISpiralLine3d> Create(
            const Coordinate3d& coord,
            double radius,
            const Intervald& range,
            double heightCoef,
            double radiusCoef = 0,
            bool antiClockwise = true
        );

    public:
        /// \brief  获取坐标系
        /// \return 成功返回坐标系对象
        virtual Coordinate3d GetCoordinate() const = 0;

        /// \brief  设置坐标系
        /// \param coord  坐标系对象
        /// \return void
        virtual void SetCoordinate(const Coordinate3d& coord) = 0;

        /// \brief  获取螺旋线的半径
        /// \return 半径
        virtual double GetRadius() const = 0;

        /// \brief  设置螺旋线的半径
        /// \param radius  半径值
        /// \return void
        virtual void SetRadius(double radius) = 0;

        /// \brief  获取螺旋线的参数范围
        /// \return 范围对象
        virtual Intervald GetRange() const = 0;

        /// \brief  设置螺旋线的参数范围
        /// \param range 范围对象
        /// \return void
        virtual void SetRange(const Intervald& range) = 0;

        /// \brief 获取顺时针或逆时针方向，true：逆时， false：顺时
        /// \return  时针方向
        virtual bool IsAntiClockwise() const = 0;

        /// \brief  设置螺旋线顺逆方向
        /// \param clockSign  1：逆时， -1：顺时
        /// \return void
        virtual void SetAntiClockwise(bool antiClockwise) = 0;

        /// \brief  获取螺旋线的高度系数 
        /// \return 含义为螺旋线的高度/range.Length()
        virtual double GetHeightCoefficient() const = 0;

        /// \brief  设置螺旋线的高度系数 
        /// \param heightCoef  含义为螺旋线的高度/range.Length()
        /// \return void
        virtual void SetHeightCoefficient(double heightCoef) = 0;

        /// \brief  获取螺旋线的半径系数 
        /// \return 含义为螺旋线的半径差/range.Length(),0代表常半径
        virtual double GetRadiusCoefficient() const = 0;

        /// \brief  设置螺旋线的半径系数 
        /// \param radiusCoef  含义为螺旋线的半径差/range.Length(),0代表常半径
        /// \return void
        virtual void SetRadiusCoefficient(double radiusCoef) = 0;
    };
}